"use strict";

//------------------------------------------------------------------------------
// Rule Definition
//------------------------------------------------------------------------------

/** @type {import('eslint').Rule.RuleModule} */
module.exports = {
  meta: {
    type: 'suggestion',
    docs: {
      description: 'Require a final `else` clause in `if-else if` chains',
      category: 'Best Practices',
      recommended: false,
    },
    fixable: 'code', // 指定规则可修复
    messages: {
      missingFinalElse: 'An `if-else if` chain should end with a final `else` clause to handle unexpected cases.',
    },
    schema: [],
  },
  create(context) {
    // 有无最后的else分支区别在于最后的alternate是不是一个IfStatement
    return {
      IfStatement(node) {
        // 检查是否存在 `else` 分支
        const hasElse = node.alternate !== null;

        // 如果没有 `else` 分支，直接返回
        if (!hasElse) return;

        // 遍历 `else if` 链，找到最后一个分支
        let current = node.alternate;

        while (current && current.type === 'IfStatement') {
          current = current.alternate;
        }

        // 如果最终没有 `else`，报告错误并提供修复
        if (current === null) {
          context.report({
            node,
            messageId: 'missingFinalElse',
            fix(fixer) {
              // 插入一个空的 `else` 块
              return fixer.insertTextAfter(node, ' else {}');
            },
          });
        }
      },
    };
  },
};
